D8-SqlClient¶
Сервис, предназначенный для импорта данных из внешних СУБД в систему Дельта с использованием SQL-запросов и экспорта данных из системы Дельта в таблицы СУБД.
Аргументы командной строки¶
-
-regserver (-r, -service)
Регистрация службы.
-
-unregserver (-u)
Отмена регистрации службы.
-
-run
Запуск в режиме приложения (а не службы Windows NT).
-
-logsql
Логирование всех отправляемых SQL-запросов.
Формат конфигурационного файла¶
<configuration logSql="true/false, default: false">
<instances>
<instance
name="text"
traceLevel="trace_level" [ Off ]
destDbConstr="text, generalize constr"
destOverwrite="true/false, default: false"
clientllConstr="text"
clientllAuthConstr="text"
sourceProviderClass="oledb/odbc/mssql/oracle"
sourceConstr="text"
sourceSecondaryConstr="text"
failoverOnRequestError="true/false", default: true
watchdogTimeout="timespan, default: 00:00:00 - not used"
impersonationUser="[domain\]username, default - not used"
impersonationPassword="userpassword, default - empty"
>
<netuse
remoteName="share_path"
localName="network_drive_name"
user="user"
password="password" />
<prepareLastTimeQuery>sql_query_template</prepareLastTimeQuery>
<loadLastTimeQuery>sql_query_template</loadLastTimeQuery>
<saveLastTimeQuery>sql_query_template</saveLastTimeQuery>
<requests>
<request
name="text"
traceLevel="trace_level" [ <instance>.traceLevel ]
readRate="timespan, default: 00:01:00"
readSchedule="Schedule, default: *"
readImmediate="true/false, default: false"
syncRate="timespan, default: 00:30:00"
syncInterval="timespan, default: 01:00:00"
syncSchedule="Schedule, default: *"
syncImmediate="true/false, default: false"
singleRequest="true/false, default: false"
ignoreResult="true/false, default: false"
sourceTimeshift="timespan, default: 00:00:00"
disableResTimestampCheck="true/false", default: false
useTransactions="true/false", default: false
commandTimeout="int_seconds, default: null" >
<copyFile
sourcePath="file_path"
destPath="file_path"
checkForModifications="true/false", default: false />
<readSourceQuery formatCulture="culture, default: en-US">sql_query_template</readSourceQuery>
<syncSourceQuery formatCulture="culture, default: en-US">sql_query_template</syncSourceQuery>
<beforeWriteDestQuery formatCulture="culture, default: en-US">sql_query_template</beforeWriteDestQuery>
<writeDestQuery formatCulture="culture, default: en-US">sql_query_template</writeDestQuery>
<afterWriteDestQuery formatCulture="culture, default: en-US">sql_query_template</afterWriteDestQuery>
<sourceTimezone
timezoneString="timezone_definition, default: null"
bias="int_minutes, default: 0 [DEPRECATED]"
daylightSaving="true/false, default: false [DEPRECATED]" />
<params>
<param
d8Id="int"
d8Type="Analog/Discrete/Vector/Record/Null"
d8MetaType="metaTypeShortName, default: null"
srcId1="text"
srcId2="text"
coefK="double, default: 1.0"
coefC="double, default: 0.0"
readToClientll="int, default: 1"
syncToClientll="int, default: 0" />
<param ... />
...
</params>
</request>
<request ... />
...
</requests>
</instance>
<instance ... />
...
</instances>
</configuration>
Тэг <configuration>¶
Корневой тэг. Его элементы:
-
logSql
Признак логирования всех отправляемых SQL-запросов.
-
@<instances>@
Содержит перечень тэгов<instance>с описанием инстансов Дельта.
Тэг <instance>¶
Содержит описание одного инстанса Дельта. Его атрибуты и вложенные тэги:
-
name
Логическое имя инстанса. Используентся для логирования.
-
traceLevel
Уровень трассировки. Определяет то, насколько подробным будет вывод в файл трассировки применительно к событиям этого инстанса.
Возможные значения:Off, Critical, Error, Warning, Information, Verbose, Verbose2, Verbose3, Verbose4, All.
При уровнеVerboseв журнал трассировки выводится текст SQL-запросов, если не используется настройкаlogSql.
-
destDbConstr -
archiveDbConstr
Строка подключения к архивной БД Дельта. Можно не указывать, если запись данных в архив не требуется.
-
archiveOverwrite -
destOverwrite
Разрешение на перезапись данных в архиве Дельта.
-
clientllConstr
Строка подключения к датасерверу Дельта. Не нужно указывать, если запись данных в датасервер не требуется.
-
clientllAuthConstr
Строка подключения к БД НСИ Дельта, которая будет использоваться для Windows-авторизации в датасервере.
-
sourceProviderClass
Тип подключения к БД-источнику. Возможные значения:odbc- ODBC (System.Data.Odbc.OdbcConnection)oledb- OLEDB (System.Data.OleDb.OleDbConnection)oracle- Oracle (System.Data.OracleClient.OracleConnection)mssql- MS SQL Server (System.Data.SqlClient.SqlConnection)
-
sourceSecondaryConstr
Строка подключения к вторичному (резервному) БД-источнику. Если строка подключения вторичного источника указана, то в случае ошибки в работе с первичным источником служба переключится на вторичный источник. При возникновении первой ошибки с вторичным источником служба переключится обратно на первичный источник.
-
failoverOnRequestError
Признак того, считать ли ошибки выполнения SQL-запросов поводом для переключения на резервный источник данных. Если нет, то поводом будут только ошибки подключения к источнику.
-
watchdogTimeout
Если указано - период времени, с которым будет срабатывать сторожевой таймер в потоке, обрабатывающем инстанс, если поток перестанет отвечать на запросы.
-
impersonationUser
Если указано - задает учетную запись, от лица которой будет выполнятся поток.
-
impersonationPassword
Задает пароль для учетной записиimpersonationUser.
-
<netuse>
Описывает сетевой ресурс, который нужно подключить перед выполнением запросов (см. ниже).
-
<prepareLastTimeQuery>
Текст SQL-запроса для для подготовки хранилища состояния обработки данных.
Может использоваться для того, чтобы создать таблицы, необходимые службе для сохранения меток времени последних принятых данных или выполнения любых других подготовительных действий. Этот запрос выполняется в первую очередь. Запрос не выполняется, если тэг<prepareLastTimeQuery>не указан.
-
<loadLastTimeQuery>
Текст SQL-запроса, который используется для считывания последних меток времени параметров на старте службы. Этот запрос выполняется после запроса<prepareLastTimeQuery>. Загрузка последних меток времени не выполняется, если тэг<loadLastTimeQuery>не указан.
-
<saveLastTimeQuery>
Текст SQL-запроса, который используется для сохранения последних меток времени параметров после выполнения очередного считывания данных. Запрос не выполняется, если тэг<saveLastTimeQuery>не указан.
-
<requests>
Содержит список тэгов<request>с описанием запросов на чтение и синхронизацию данных.
Тэг <netuse>¶
Описывает сетевой ресурс, который нужно подключить перед выполнением запросов. Его атрибуты:
-
remoteName
Сетевой путь общей папки.
-
localName
Имя локального сетевого диска (можно не указывать).
-
user
Имя пользователя для доступа к сетевому ресурсу (можно не указывать).
-
password
Пароль для доступа к сетевому ресурсу (можно не указывать).
Тэг <request>¶
Описывает один запрос на чтение и, опционально, синхронизацию (перечитывание) данных.
-
name
Логическое имя запроса. Используентся для логирования.
-
traceLevel
Уровень трассировки. Определяет то, насколько подробным будет вывод в файл трассировки применительно к событиям этого запроса.
При уровнеVerboseв журнал трассировки выводится текст SQL-запросов, если не используется настройкаlogSql.
-
readRate
Периодичность выполнения запроса на чтение данных.
-
readSchedule
Расписание выполнения запроса на чтение данных. Если оно задано, запросreadSourceQueryбудет выполнятся по заданному расписанию, но не чаще, чем с периодом, заданным вreadRate.
-
readImmediate
Признак того, нужно ли выполнить чтение сразу при запуске службы.
Если онreadImmediate="true", то первый раз запросreadSourceQueryбудет выполнен сразу на старте службы, невзирая на расписание. Далее запросы будут выполнятся по расписанию.
-
syncRate
Периодичность выполнения запроса на синхронизацию данных. Если равна нулю (request.syncRate="00:00:00"), то синхронизация не выполняется.
-
syncInterval
Глубина синхронизации по времени.
-
syncSchedule
Расписание выполнения запроса на синхронизацию данных.
-
syncImmediate
Признак того, нужно ли выполнить синхронизацию сразу при запуске службы.
-
singleRequest
Если установлено значениеtrue, то все параметры обрабатываются одним запросом. Если часть параметров при этом не удалось обработать, то повторных запросов не происходит.
-
ignoreResult
Если установлено вtrue, то результаты выполнения SQL-запроса игнорируются. Такой запрос не может использоваться для получения данных.
-
<copyFile>
Если этот элемент указан, то он описывает какой файл и куда нужно копировать каждый раз перед выполнением запросовreadSourceQueryиsyncSourceQuery.
Опционально можно задать проверку на наличие изменений в файле.
-
<readSourceQuery>
Текст SQL-запроса, который используется для чтения данных из БД-источника.
-
<syncSourceQuery>
Текст SQL-запроса, который используется для синхронизации данных из БД-источника. Если не указан, то считается что текст запроса синхронизации такой же, что и текст запроса на чтение данных.
-
<beforeWriteDestQuery>
Текст SQL-запроса, который выполняется в БД-получателе перед выполнением запросаwriteDestQuery. Можно не указывать. Выполняется только при наличии запросаwriteDestQuery.
-
<writeDestQuery>
Текст SQL-запроса, который выполняется в БД-получателе для сохранения данных. Если указан запросbeforeWriteDestQuery, то запросwriteDestQueryвыполняется только при успешном выполнении запросаbeforeWriteDestQuery. Если указанwriteDestQuery, то стандартный механизм сохранения данных в архиве и датасервере не используется.
-
<afterWriteDestQuery>
Текст SQL-запроса, который выполняется в БД-получателе после успешного выполнения запросаwriteDestQuery. Можно не указывать. Выполняется только при наличии запросаwriteDestQuery.
-
<sourceTimezone>
Задает часовой пояс меток времени в БД-источнике.
-
sourceTimeshift
Задает дополнительный сдвиг времени к меткам времени, получаемым от БД-источника.
-
disableResTimestampCheck
Позволяет выключить проверку на то, что значения параметра принимаются с увеличивающимися метками времени.
-
useTransactions
Включает использование транзакций для запросовbeforeWriteDestQuery, writeDestQuery, afterWriteDestQuery.
Все эти запросы будут выполняться в одной транзакции. В случае ошибки транзакция откатывается.
-
commandTimeout
Таймаут выполнения SQL-запроса (в секундах). Если не указано или ноль, то используется значение по умолчанию, установленное провайдером БД.
-
<params>
Содержит перечень тэгов<param>, описывающих связь данных в БД-источнике и инстансе Дельта.
Тэг <sourceTimezone>¶
Содержит описание временной зоны. Имеет единственный атрибут:
-
timezoneString
Строка определения временной зоны в форматеTimeConverter.
Устаревшие атрибуты (использовались вместо timezoneString):
-
bias
Сдвиг в минутах от UTC.
-
daylightSaving
Признак использования переходов на летнее/зимнее время.
Тэг <param>¶
Задает сопоставление между идентификаторами, применимыми к БД-источнику и идентификаторами параметров Дельта.
-
d8Id
Идентификатор параметра Дельта.
-
d8Type
Тип параметра Дельта.
Еслиd8Type="Null", то значения, получаемые в результате выполнения запросов чтения данных не конвертируются в типы данных Дельта, а сохраняются в виде массива объектов.
Возможные типы параметров:Analog- аналоговыйDiscrete- дискретныйVector- векторныйRecord- табличныйNull- неопределенный
-
d8MetaType
Мета-тип параметра (краткое имя типа).
-
srcId1
Первый идентификатор данных в БД-источнике.
-
srcId2
Второй идентификатор данных в БД-источнике. Можно не указывать, если одного идентификатора (srcId1) достаточно для связывания данных.
-
coefK
Коэффициент, на который будут помножены получаемые значения.
-
coefC
Коэффициент, который будет прибавлен к получаемым значениям.
-
readToClientll
Ограничение по количеству значений из результата выполнения запросаreadSourceQuery, отправляемых в датасервер.
По умолчаниюsendLimit="1"и отправляется только самое последнее значение. Если значение 0, то данные параметра вообще не отправляются в датасервер.
Если указано значениеn > 1, то отправляютсяnпоследних значений (с бóльшими метками времени) для этого параметра.
-
syncToClientll
Ограничение по количеству значений из результата выполнения запросаsyncSourceQuery, отправляемых в датасервер.
По умолчанию 0 и данные параметра не отправляются в датасервер.
Если указано значениеn > 0, то отправляютсяnпоследних значений (с бóльшими метками времени) для этого параметра.
Тэг <copyFile>¶
Описывает процедуру копирования файла перед выполнение запросов чтения и синхронизации данных.
-
sourcePath
Полный путь файла, который нужно копировать.
-
destPath
Полный путь файла в папке назначения.
-
checkForModifications
Еслиtrue, то размер файла и время его изменения будет предварительно сравнено со значениями, полученными при последнем копировании (с момента запуска службы). Если окажется, что файл не изменился, то запрос чтения/синхронизации не выполняется (и файл не копируется).
Токены для формирования SQL-запросов¶
Текст запросов readSourceQuery, syncSourceQuery, prepareLastTimeQuery, loadLastTimeQuery, saveLastTimeQuery может содержать токены, заменяемые на значения, которые зависят от контекста выполнения запроса (идентификаторы параметров, последнее время параметра, получаемые значения и метки времени, текущее время и т.д.). Конкретный набор токенов для каждого запроса свой.
Токены можно разделить на две группы: токены для формирования текста SQL-запроса и токены для парсинга результата запроса. Токены для парсинга начинаются на #res.
Токены для формирования SQL-запроса¶
Общий формат токена:
{#reqtoken} или {#reqtoken:foramt}
{#reqtoken-paramname} или {#reqtoken-paramname:foramt}
{#reqtoken-paramname?} или {#reqtoken-paramname?:foramt}
{#reqtoken/subtokenIdx}
{#reqtoken/subtokenName}
{#reqtoken/subtokenName-paramname?:format}
Через слэш можно указать индекс (subtokenIdx) или наименование поля (subtokenName) внутри токена. Для значений-массивов (токен d8value) это будет индекс в массиве или название свойства в мета-типе.
Через минус можно указать имя параметра команды (paramname) на выполнение SQL-запроса. Если имя параметра команды указано, то значение будет передано в СУБД не в виде текста команды, а в виде параметра. Это можно использовать, чтобы передавать значения, которые сложно сериализовать в текст (например, дата/время или строки со спецсимволами).
Вопросительный знак после paramname означает, что значение может быть null.
Через двоеточие можно опционально указать форматирование в стиле .NET. Например:
SELECT * FROM srctable WHERE srct > '{#lasttime:yyyy-MM-dd HH:mm:ss}'
При подстановке значения вместо токена будет использована культура, указанная в атрибуте formatCulture тэга с описанием запроса (<xxxQuery>).
reqtoken):
d8id-param.d8Idd8value- значение параметра системы Дельта с id равнымparam.d8Idd8value/0- значение с индексом 0 (первое) для значения-массиваd8value/1- значение с индексом 1 для значения-массиваd8value/N- значение с индексом N для значения-массиваd8value/SomeProp- значение свойства с названиемSomePropd8timestamp- метка времени параметра системы Дельта с id равнымparam.d8Idd8state- статус параметра системы Дельта с id равнымparam.d8Idd8xstate- доп.статус параметра системы Дельта с id равнымparam.d8Idsrcid1-param.srcId1srcid2-param.srcId2lasttime- последняя метка времени параметра системы Дельта с id равнымparam.d8Id. Для запросаsaveLastTimeQueryэта метка времени передается в UTC. Для запросаreadSourceQuery/syncSourceQueryэто метка времени переводится в часовой пояс, указанный в тэгеsourceTimezone.localtime- текущее местное времяutctime- текущее время UTC
Токены для парсинга результатов SQL-запроса¶
Общий формат токена:
{#restoken}
{#restoken/subtokenIdx}
{#restoken/subtokenName}
{#restoken:format}
{#restoken,subst}
{#restoken,subst:format}
{#restoken:?datatype}
{#restoken:format?datatype}
{#restoken?:format?datatype}
{#restoken?:format?datatype}
Через слэш можно указать индекс (subtokenIdx) или название свойства (@subtokenName) для значений векторных или табличных парметров.
Через запятую можно указать текст (subst), на который токен будет заменен на этапе формирования текста SQL-запроса. Например:
SELECT srcvalue AS {#resValue,VAL} FROM srctable
Через двоеточие можно указать формат (format), в котором источник данных возвращает значение. Например:
SELECT srct AS {#resTimestamp,TM:ddMMyyyyHHmm} FROM srctable
Через знак вопроса можно указать тип данных, к которому нужно привести значение, которое источник данных возвращает. Например:
SELECT {#resTimestamp:ddMMyyyyHHmm?System.DateTime}srct FROM srctable
SELECT srcint{#resValue:?System.Int32} FROM srctable
Поддерживаемые токены (restoken):
ressrcid1-param.srcId1ressrcid2-param.srcId2resvalue- значение параметраrestimestamp- метка времени параметра. Будет переведена из часового пояса, указанного в тэгеsourceTimezone, в UTC.resstate- статус параметраresxstate- доп.статус параметраresignore- поле игнорируется
Во всех случаях регистр имен токенов (reqtoken) не имеет значения.
Вопросительный знак в конце названия токена означает nullable-тип данных. Значения таких типов данных конвертируются в null при чтении БД-источника, если в результате запроса вернулся DbNull. А при форматирование запроса для записи в БД-получатель такие значения форматируются в строку "NULL", а апострофы вокруг него удаляются (при их наличии).
Если нужно, чтобы данные передавались БД-провайдеру в виде параметров, а не текста, то нужно указать paramname.
Особенности обработки запросов¶
Запрос prepareLastTimeQuery¶
Можно не указывать.
Запрос используется для подготовки БД для хранения последних полученных меток времени. Для этого в БД должна быть создана таблица, где можно хранить ключ параметра и его последнюю метку времени или хранимые процедуры для чтения и записи последних меток времени.
Метка времени в БД должна быть типа DateTime. Ключом может быть целое число (d8Id) или строка (srcId1, srcId2 или их комбинация). Имя таблицы значения не имеет.
Токены форматирования не используются, результирующие данные запроса не анализируется.
Выполняется один раз на старте службы. Если запрос выполняется с ошибкой, то он будет выполнен повторно через некоторое время. Другие запросы не будут выполнятся, пока prepareLastTimeQuery не выполнится корректно.
Например:
IF (SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='lasttime') IS NULL
BEGIN
CREATE TABLE [dbo].[lasttime]([N] [int] NOT NULL, [T] [datetime] NOT NULL,
CONSTRAINT [PK_lasttime] PRIMARY KEY ([N] ASC))
END
Запрос loadLastTimeQuery¶
Можно не указывать (тогда последние метки времени не инициализируются).
Запрос используется для считывания последних меток времени параметров на старте службы.Поддерживаются токены:
d8idsrcid1srcid2
Результатом запроса всегда считается одно значение типа DateTime (в UTC).
Выполняется один раз на старте службы, но не раньше, чем выполнится prepareLastTimeQuery.
Например:
SELECT T FROM [dbo].lasttime where N={#d8Id}
Запрос saveLastTimeQuery¶
Можно не указывать.
Запрос используется для сохранения последних меток времени параметров.Поддерживаются токены форматирования:
d8idsrcid1srcid2lasttime- всегда передается в UTC
Результирующие данные запроса никак не анализируются. Выполняется каждый раз, когда служба получает значение с более свежей меткой времени по какому-то параметру.
Например:
IF EXISTS (SELECT N FROM [dbo].lasttime where N={#d8Id})
UPDATE [dbo].lasttime SET T='{#lastTime:yyyy-MM-dd HH:mm:ss}' WHERE N={#d8Id}
ELSE
INSERT INTO [dbo].lasttime (N, T) VALUES ({#d8Id}, '{#lastTime:yyyy-MM-dd HH:mm:ss}')
Запрос readSourceQuery¶
Запрос используется для считывания данных из БД-источника. Вызывается периодически для каждого тэга request. Сначала текст запроса формируется для первого param в тэге request. При разборе таблицы, которая будет получена как результат запроса, все парамтеры (тэги param), для которых в этой таблице будут найдены значения, помечаются как обработанные. Дальше запрос повторяется для всех param в тэге request, для которых флаг обработки еще не выставлен. Запрос повторяется до тех пор, пока список тэгов param не будет пройден до конца либо пока у всех тэгов param не будет выствлен флаг обработки. Если по ходу этого цикла формирования запросов будет сформирован запрос с текстом, таким же, как текст запроса, отправленного на предыдущем этапе цикла, то такой запрос не выполняется.
Кроме периодичности выполнения запроса (атрибут readRate), можно указать расписание readSchedule. Если оно задано, запрос readSourceQuery будет выполнятся по заданному расписанию, но не чаще, чем с периодом, заданным в readRate.
В дополнение к readSchedule можно указать атрибут readImmediate. Если он имеет значение true, то первый раз запрос readSourceQuery будет выполнен сразу на старте службы, невзирая на расписание. Далее запросы будут выполнятся по расписанию.
utctime- всегда в UTClocaltime- всегда передается в часовом поясеsourceTimezoned8idsrcid1srcid2lasttime- перед запросом переводится из UTC в часовой поясsourceTimezoneи вычитается значениеsourceTimeshiftressrcid1ressrcid2resvaluerestimestamp- будет переведена из часового поясаsourceTimezoneв UTC и к ней будет прибавлено значениеsourceTimeshiftresstateresxstateresignore
Для параметров Дельта с типом Vector (т.е. если <param>.d8Type="Vector") все значения в строке результатов запроса, помеченные токеном resvalue, записываются в один список объектов, который затем сериализуется в векторное значение, которе можно отправить датасерверу или записать в архив векторного параметра.
Для параметров Дельта с типом Record все значения в строке результатов запроса, помещаются в запись табличного параметра. Чтобы определить формат записи используется мета-тип (<param>.d8MetaType). Затем, при обработке запроса writeDestQuery можно обращаться к элементам этого списка с помощью токенов d8value/1 или d8value/SomeProp.
Для параметров Дельта с типом Null все значения в строке результатов запроса, помеченные токеном resvalue, записываются в один список объектов, который никак не сериализуется. Затем, при обработке запроса writeDestQuery можно обращаться к элементам этого списка с помощью токенов d8value/0, d8value/1, и т.д.
Для каждого параметра Дельта с id равным -1 (<param>.d8Id="-1") в результате выполнения readSourceQuery может быть получено произвольное количество значений. Для параметров с определенным id - только одно или ниодного.
Если список параметров запроса пуст, то он автоматически заполняется единственным параметром вида
<param d8Id="-1" d8Type="Null"/>
Примеры:
SELECT srcvalue AS {#resValue,VAL}, TM AS {#resTimestamp,TM:ddMMyyyyHHmm},
SKIP AS {#resIgnore,IGNORE}, QUAL{#resState}, {#resxstate,AUX}
FROM SRCTABLE WHERE IDENT='{#srcId1}' AND TM>'{#lasttime:yyyy-MM-dd HH:mm:ss}'
-- групповая выборка
SELECT *{#ressrcid1}{#resvalue}{#resignore}{#restimestamp}{#resignore}{#resstate}
FROM SRCTABLE WHERE TM>='{#lasttime:yyyy-MM-dd}'
-- выборка из архива системы Дельта за текущие сутки
SELECT {#ressrcid1,N}, {#resvalue,V},
CAST(CAST(CAST('{#utctime:yyyy-MM-dd}' as datetime) as float) + CAST(T as float)/(1000.*60.*60.*24.) as datetime),
{#resstate,S}, {#resxtate,XS}
FROM dbo.A{#utctime:ddMMyyyy} WHERE N={#srcid1} AND V>100
-- выборка из БД РДГ значений ПБР за текущие сутки
-- param.srcId1 - это id ГТП, param.srcId2 - это номер ПБР
SELECT
CONVERT(nvarchar, CAST(PBRValueDate-693596 as datetime), 104) + ' '
+ CAST(PBRValueTime/(1000*60*60) as nvarchar) + ':'
+ CAST(PBRValueTime/(1000*60)%60 as nvarchar) + ':'
+ CAST(PBRValueTime/1000%60 as nvarchar) + '.'
+ CAST(PBRValueTime%1000 as nvarchar)
AS {#restimestamp,TS:dd.MM.yyyy H:m:s.f}, {#resvalue,PBRValue}
FROM dbo.RDGPlanValues
WHERE PBRID=(SELECT TOP(1) PBRID FROM dbo.RDGPlans
WHERE GTPNumber={#srcId1} AND PBRNumber={#srcId2} AND
PBRDate=CAST(CAST('{#utctime:yyyy-MM-dd}' as datetime) as float)+693596 ORDER BY PBRID DESC)
AND ParamID=(SELECT PDGParamID FROM dbo.RDGGTPs WHERE GtpID={#srcId1})
ORDER BY PBRValueDate, PBRValueTime
Запрос syncSourceQuery¶
Обрабатывается аналогично readSourceQuery, за исключением того, что
- токен
lasttimeпринимает значение, равное текущему времени в часовом поясе источника минус значениеsyncInterval, - запросы loadLastTimeQuery/saveLastTimeQuery не обрабатываются,
- значения в датасервер не отправляются никогда (записываются только в архив).
Запрос beforeWriteDestQuery¶
Выполняется, если в конфигурации указан запрос writeDestQuery.
Выполняется после чтения данных один раз (а не по разу для каждого значения или параметра).
Токены форматирования не поддерживает.
Запрос writeDestQuery¶
Выполняется после чтения данных и, если в конфигурации указан запрос beforeWriteDestQuery, только после успешного завершения запроса beforeWriteDestQuery.
При обработке writeDestQuery для каждого значения, полученного в результате чтения данных будут формироваться SQL-запросы. Если очередной SQL-запрос совпадет с предыдущим, то его выполнение будет пропущено и обработка перейдет к следующему значению.
utctime- всегда в UTClocaltime- всегда передается в часовом поясе sourceTimezoned8idsrcid1srcid2lasttime- всегда в UTCsrcid1srcid2d8valued8value0...d8value29d8timestamp- всегда в UTCd8stated8xstate
Для того, чтобы использовать токены d8value0..d8value29 для обращения к элементам значений-массивов (записей), полученных в результате чтения данных, нужно, чтобы тип параметра <param>.d8Type был равен Null.
Запрос afterWriteDestQuery¶
Выполняется, если в конфигурации указан запрос writeDestQuery.
Выполняется после запроса writeDestQuery, если выполнение запроса writeDestQuery завершилось без ошибок.
Токены форматирования не поддерживает.
История версий¶
1.4.21.0618- Исправлена ошибка из-за которой не работали запросы, если не указана строка соединения БД-получателя, даже если в ней нет необходиности.
1.4.21.0400- Служба переведена на формат
PrimtiveService. - Добавлены настройки
traceLevelдля элементовinstanceиrequest.
- Служба переведена на формат
1.3.20.0220- Добавлен построитель запросов
QueryBuilder, для возможности написания универсальных запросов, совместимых с различные типы баз данных.
- Добавлен построитель запросов
1.3.19.0709- Добавлена настройка
failoverOnRequestError. По умолчанию выставлена вtrue- считать ошибки выполнения запросов выборки данных поводом для переключения на резервный источник.
- Добавлена настройка
1.3.18.0506- Добавлена возможность копирования файла перед выполнение запросов чтения/синхронизации данных.
- Соединение с БД-источником теперь устанавливается непосредственно перед выполнением запросов к БД.
1.3.18.0406- Добавлена функция перключения на резервный исчник данных в случае сбоя в работе с основным источником данных.
- Исправлена ошибка из-за которой период чтения после ошибки увеличивался до минимум 60 секунд.
1.3.17.0214- Добавлена возможность отправки нескольких значений для каждого параметра в датасервер после запроса чтения данных (атрибут
<param>.readToClientll). - Добавлена возможность отправки значений в датасервер после запроса синхронизации данных (атрибут
<param>.syncToClientll). - Изменена логика обработки последних меток времени. Если возникает ошибка при обработке запроса чтения данных, последние метки времени откатываются к состоянию, которое было до запуска обработки. Обработка последних меток времени полностью развязана с отправкой данных в датасервер.
- Добавлена возможность отправки нескольких значений для каждого параметра в датасервер после запроса чтения данных (атрибут
1.3.17.0320- Исправлена ошибка, из-за которой статистика значений, отправленных запросами
writeDestQuery, могла определиться неверно.
- Исправлена ошибка, из-за которой статистика значений, отправленных запросами
1.3.16.1027- Исправлена ошибка деления ноль в момент логирования статистики.
1.3.16.0803- Добавлена настройка
ignoreResultдля запросов. Если указана, то все, что вернула SQL-команда игнорируется.
- Добавлена настройка
1.3.16.0520- Добавлен таймаут на выполнения SQL-запросов.
1.3.16.0412- Улучшено логирование ошибок преобразования типов данных.
- Исправлена ошибка, которая могла произойти при избыточном конвертировании
DateTimeвStringи обратно вDateTime. - Добавлена возможность использовать параметры в SQL-запросах. Теперь можно в имени тэга через минус указать имя соответствующего параметра.
- Добавлена возможность использования транзакции для
beforeWriteDestQuery,writeDestQueryиafterWriteDestQuery. - Улучшена обработка исключений.
1.3.16.0329- Изменения в API.
1.3.15.1125- Добавлена установка свойства
AppDescrдля соединения с датасервером.
- Добавлена установка свойства
1.3.15.1022- Добавлена возможность запуска потока обработки инстанса из-под указанной учетной записи (тэги
impersonationUserиimpersonationPassword). - Добавлена возможность указывать тип данных как nullable.
- Добавлена возможность запуска потока обработки инстанса из-под указанной учетной записи (тэги
1.3.15.1016- Теперь после неужачной попытки соединения с БД будет сделана пауза в 1 минуту.
1.3.15.0924- Добавлена возможно чтения данных в виде произвольных записей.
- Добавлена возможность записи данных в БД-получатель произвольными SQL-запросами.
- Для использования записи произвольными SQL-запросами можно использовать тэги
<beforeWriteDestQuery>,<writeDestQuery>,<afterWriteDestQuery>. - Атрибуты
<instance>.archiveDbConstrи<instance>.archiveOverwriteпереименованы вdestDbConstrиdestOverwrite. Старые названия оставлены как синонимы для обратной совместимости. - Добавлены токени форматирования
#d8value, #d8value0, #d8value1, .. #d8value29, #d8state, #d8xstate, #d8timestamp.
1.2.15.0924- Теперь служба раз в пять минут выводит в лог статистику по выполненным запросам.
- Для подключения к архивной БД Дельта теперь использует провайдер .NET (раньше использовался OLEDB).
1.2.15.0923- Добавлен сторожевой таймер инстансов (настройка
<instance>.watchdogTimeout).
- Добавлен сторожевой таймер инстансов (настройка
1.2.15.0724- Улучшен парсинг значений для токенов
#resstateи#resxstate.
- Улучшен парсинг значений для токенов
1.2.15.0623- Добавлена возможность подключения сетевого ресурса с помощью
<instance>.<netuse>. - Теперь пишет лог в отдельный evt-файл.
- Добавлена возможность подключения сетевого ресурса с помощью
1.2.15.0326- Добавлена настройка
<request>.disableResTimestampCheck.
- Добавлена настройка
1.2.15.0326- Добавлена поддержка векторных параметров.
- Добавлена поддержка нескольких токенов
#resvalueв одном запросе. В этом случае значение будет сериализована как массив объектов (IList<object>). - Теперь для токена
#resvalueвместо строки форматирования можно указать имя системного типа .NET. Если оно указано, то получаемое от источника значение будет сконвертировано в этот тип (например,SELECT {#resvalue:?System.Double}'123.456', {#resvalue:?System.String}123456 FROM table). - Добавлена поддержка атрибута
<request>.sourceTimeshift.
1.2.14.1125- Переведена на .NET4, теперь использует классы из
d8_client3взаменd8_nativeclient. - Используется новый класс для перевода часовых поясов.
- Добавлена настройка
<timezone>.timezoneString. Если указана, то представляет собой строку с описанием часового пояса. - Добавлена настройка
<request>.sourceTimezone. Эта величина прибавляется к меткам времени, получаемым в результатах выполнения запросовreadSourceQuery/syncSourceQuery.
- Переведена на .NET4, теперь использует классы из
1.1.14.1125- Исправлена ошибка, проявлявшаяся, если не указать
<sourceTimezone>. - Выполнение запроса
saveLastTimeQueryотделено от отправки последних значений в датасервер. - Теперь можно не указывать
saveLastTimeQuery, если нужно только отправлять принятые данные в датасервер.
- Исправлена ошибка, проявлявшаяся, если не указать
1.1.14.0414- Теперь при отсутствии подключения к
CS-DataServerслужба не выполняет запросы к источникам данных, а при длительном отсутствии подключения, экземпляр соединения пересоздается полностью.
- Теперь при отсутствии подключения к
1.1.13.1225- Исправлена ошибка в обработке
readImmediateиsyncImmediate.
- Исправлена ошибка в обработке
1.1.13.1007- Добавлена настройка
<request>.singleRequest. Если установлено значениеtrue, то все параметры обрабатываются одним запросом. Если часть параметров при этом не удалось обработать, то повторных запросов не происходит.
- Добавлена настройка
1.1.13.0417- Теперь SQL-команды при выводе в лог ограничиваются по длине в 2048 символов.
- Служба переведена на новый набор общих библиотек.
1.0.12.0113- Добавлены функции расписания для запросов
readSourceQuery/syncSourceQuery.
- Добавлены функции расписания для запросов
1.0.11.1019- Добавлена обработка ситуации, когда подключение к
CS-DataServerневозможно из-за отсутствия соединения с БД, в которой хранятся ключи авторизации.
- Добавлена обработка ситуации, когда подключение к
1.0.11.1006- Добавлена поддержка дискретных парамтеров. У тэга
<param>теперь есть атрибутd8Type.
- Добавлена поддержка дискретных парамтеров. У тэга
1.0.11.0928- Теперь текст запроса
saveLastTimeQueryможет быть пустым. Тогда он не выполняется, но последние значения для параметров все-равно отправляются вCS-DataServer.
- Теперь текст запроса
1.0.10.1122- Исправлена ошибка в обработке
syncRate.
- Исправлена ошибка в обработке
1.0.10.1113- Добавлена отправка в
CS-DataServer. Отсылает только последнее (по времени) значение по каждому параметру. - Добавлено ожидание подключения с
DataServer. Если соединения нет больше трех минут - работает безCS-DataServer.
- Добавлена отправка в
1.0.10.1025- Бета. Не пишет в
CS-DataServer.
- Бета. Не пишет в